const fs = require('fs'); // 文件系统
const path = require('path'); // 处理路径的模块 

// 文件系统中的方法 普遍有两种 一种是同步的 ， 另一种是异步的
// 常用api ：fs.readFile fs.writeFile


// 读取和写入耦合在一起
// 处理异常也有问题，每次需要处理一下
// 文件不能太大，如果文件太大超过了内存大小，就无法读取
// 一般认为，小于64k可以采用这种方式
// fs.readFile(path.resolve(__dirname,'a.txt'),(err,data)=>{
//     if(err) return console.log(err);
//     fs.writeFile(path.resolve(__dirname,'b.txt'),data,(err)=>{  
//         if (err) return console.log(err);
//         console.log('写入成功')
//     })
// })

// 可以采用流的方式（流中的传递是数据 数据就是二进制的）
// 有起点和终点 有方向
// fs.read() 读取某一部分数据  fs.write()  这俩2api 基本用不到 文件流是基于这两个方法的
// 如果文件不存在读取的时候会报错
// 如果写入文件不存在,会创建，如果文件中已经有内容了,会清空,这就是读写的区别
const buffer = Buffer.alloc(10)// 用10个字节的大小来实现拷贝大文件
// r 读取  w 写入  a 追加  r+ 以读取为准增加写入 |  w+ 以写入为准增加读取
// fs.open(path.resolve(__dirname,'a.txt'),'r',function(err,fd){ //fd 是一个数字 默认每打开一个文件 + 1
//     // fd 可以表示  = 描述我要操作a这个文件,并且要读取
//     // 读取a.txt第0个位置开始 将内容写入到buffer中，从buffer的第0个位置写入10个字节
//     fs.read(fd,buffer,0,10 ,0,function(err,bytesRead){ //bytesRead读取到的字节
//         // 数据读取到buffer后。
//         fs.open(path.resolve(__dirname,'b.txt'),'w',function(err,wfd){
//             // 做写入操作 写入到这个buffer中 从buffer的第0个位置开始读取，读取10个， 写入到文件的第0个位置
//             fs.write(wfd,buffer,0,bytesRead,0,function(err,written){
//                 console.log(written);
//             })
//         })
//     })
//     console.log(err,fd);
// })

// 这个代码 写和读取耦合在了一起 （回调可以先考虑采用promise减缓） 读取和写入 没有相应的关系
// 采用发布订阅的模式来进行解耦合。 文件中自己实现了文件流
// fs.open(path.resolve(__dirname,'a.txt'),'r',function(err,fd){ //fd 是一个数字 默认每打开一个文件 + 1
//     let readOffset = 0;
//     let writeOffset = 0;
//     // fd 可以表示  = 描述我要操作a这个文件,并且要读取
//     fs.open(path.resolve(__dirname,'b.txt'),'w',function(err,wfd){
//         function next(){
//             fs.read(fd,buffer,0,10 ,0,function(err,bytesRead){
//                 if(bytesRead == 0){
//                     fs.close(rfd, function () { })
//                     fs.close(wfd, function () { })
//                 }else {
//                     fs.write(wfd,buffer,0,bytesRead,0,function(err,written){
//                         readOffset += written;
//                         writeOffset += written;
//                         next()
//                     })
//                 }

//             })
//         }
//         next()
//     })
// })

// 小知识点
// 八进制0o666 文件操作模式，文件的权限 
// 2代表写入权限,4代表读取权限+1代表执行权限 2+4+1 = 7 代表有写入读取执行的权限
// chmod -R 777    -> 777 第一个7代表自己，第二个7代表自己家的人，第三个7代表别人家的人，因此777代表文件最大权限


